home *** CD-ROM | disk | FTP | other *** search
/ Qoole for Quake / Qoole for Quake (USA) / Qoole for Quake (USA).bin / Tutorial / HTML / QUBE.ZIP / SRC / LIGHT.C < prev    next >
Encoding:
C/C++ Source or Header  |  1996-11-05  |  4.9 KB  |  233 lines

  1. /* lighting.c */
  2.  
  3. #include "light.h"
  4. #include "curs.h"
  5.  
  6. /*
  7.  
  8. NOTES
  9. -----
  10.  
  11. */
  12.  
  13. float        scaledist = 1.0;
  14. float        scalecos = 0.5;
  15.  
  16. byte        *filebase, *file_p, *file_end;
  17.  
  18. dmodel_t    *bspmodel;
  19. int            bspfileface;    /* next surface to dispatch */
  20.  
  21. vec3_t    bsp_origin;
  22.  
  23. qboolean    extrasamples;
  24.  
  25. float        minlights[MAX_MAP_FACES];
  26.  
  27. FILE        *LogFile;
  28.  
  29. int        nummapbrushes = 0;
  30. int        num_entities = 0;
  31. int        nummiptex = 0;
  32.  
  33. qboolean    visbsp = 0;
  34. qboolean    visbspfast = 0;
  35. qboolean    fastlight = 0;
  36.  
  37. long        facebrightness;
  38. long            facebrightnesscount;
  39. long        levelbrightness = 0;
  40.  
  41. byte *GetFileSpace (int size)
  42. {
  43.     byte    *buf;
  44.     
  45.     LOCK;
  46.     file_p = (byte *)(((long)file_p + 3)&~3);
  47.     buf = file_p;
  48.     file_p += size;
  49.     UNLOCK;
  50.     if (file_p > file_end)
  51.         Error ("GetFileSpace: overrun");
  52.     return buf;
  53. }
  54.  
  55.  
  56. void LightThread (void *junk)
  57. {
  58.     int            i;
  59.  
  60.     ShowStatusEntry("Starting lighting thread.");
  61.     ShowTempEntry("Lighting %d faces total.", numfaces);
  62.         
  63.     MoveCurs(4, 17);
  64.     CPrintf("$b4$f6"
  65.         "$f3-----------------------------" "$n"
  66.         "  $f6Face $f2    0$f6 of $f2%ld$f6  " "$n"
  67.         "    Face number:      $f2    0$f6  " "$n"
  68.         "    Face brightness:  $f2    0$f6  " "$n"
  69.         "    Level brightness: $f2    0$f6  ", (long)numfaces);
  70.  
  71.         while (1)
  72.     {
  73.         LOCK;
  74.         i = bspfileface++;
  75.         UNLOCK;
  76.         MajorPercentBar(i * 256 / numfaces);
  77.                 fflush(stdout);
  78.         if (i >= numfaces) {
  79.             MajorPercentBar(256);
  80.                         return;
  81.         }
  82.  
  83.                 LightFace (i);
  84.  
  85.                 SetForeColor(ANSI_GREEN);
  86.         SetBackColor(ANSI_BLUE);
  87.         MoveCurs(11, 18);
  88.         CPrintf("%5i", i);
  89.         MoveCurs(26, 19);
  90.         CPrintf("%5i$n%5li$n%5li", i, facebrightness,
  91.             (levelbrightness += facebrightness) / bspfileface);
  92.         }
  93.  
  94.         MoveCurs(4, 17);
  95.     CPrintf("$b4$f6"
  96.         "                             $n"
  97.         "                             $n"
  98.         "                             $n"
  99.         "                             $n"
  100.         "                             ");
  101. }
  102.  
  103. /*
  104. =============
  105. LightWorld
  106. =============
  107. */
  108. void LightWorld (void)
  109. {
  110.     filebase = file_p = dlightdata;
  111.     file_end = filebase + MAX_MAP_LIGHTING;
  112.  
  113.     RunThreadsOn (LightThread);
  114.  
  115.     lightdatasize = file_p - filebase;
  116.     
  117.     ShowTempEntry("Light data size: %i bytes\n", lightdatasize);
  118. }
  119.  
  120.  
  121. /*
  122. ========
  123. main
  124.  
  125. light modelfile
  126. ========
  127. */
  128. int main (int argc, char **argv)
  129. {
  130.     int        i;
  131.         char            source[1024];
  132.     char        log[1024];
  133.         long            diff;
  134.  
  135.     for (i=1 ; i<argc ; i++)
  136.     {
  137. #if 0
  138.                 if (!strcmp(argv[i],"-threads"))
  139.         {
  140.             numthreads = atoi (argv[i+1]);
  141.             i++;
  142.         }
  143. #endif
  144.         if (!strcmp(argv[i],"-extra"))
  145.         {
  146.             extrasamples = true;
  147.         }
  148.         else if (!strcmp(argv[i],"-fast"))
  149.             fastlight = true;
  150.                 else if (!strcmp(argv[i],"-v"))
  151.             visbsp = true;
  152.         else if (!strcmp(argv[i],"-vf")) {
  153.             visbsp = true;
  154.                         visbspfast = true;
  155.         }
  156.                 else if (!strcmp(argv[i],"-dist"))
  157.         {
  158.             scaledist = atof (argv[i+1]);
  159.             i++;
  160.         }
  161.         else if (argv[i][0] == '-') {
  162.             fprintf(stderr, "light: Unknown option \"%s\"", argv[i]);
  163.         }
  164.                 else
  165.             break;
  166.     }
  167.  
  168.     if (i != argc - 1) {
  169.         fprintf(stderr, "Usage:   light [-extra] [-dist #] [-v] [-vf] bspfile\n"
  170.                 "\n"
  171.                 "   -extra      Perform extra scans for better lighting\n"
  172.                 "   -dist       Set scaling distance to #\n"
  173.                 "   -fast       Perform a fast but inaccurate scan\n"
  174.                 "   -v          Run \"vis\" when done with lighting\n"
  175.                 "   -vf         Run \"vis -fast\" when done with lighting\n");
  176.                 exit(-1);
  177.         }
  178.  
  179.     ScrnInit();
  180.     MoveCurs(2, 1);
  181.     CPrintf("$b4$f7Light$f4 -");
  182.  
  183.     strcpy (source, argv[i]);
  184.     DefaultExtension (source, ".bsp");
  185.  
  186.     strcpy(log, source);
  187.     StripExtension(log);
  188.     DefaultExtension (log, ".log");
  189.  
  190.     LogFile = fopen(log, "at");
  191.     fprintf(LogFile, "\n-------------------------------------------\n"
  192.              "*** BEGIN LIGHT ***\n\n");
  193.  
  194.         InitThreads ();
  195.  
  196.     MoveCurs(10, 1);
  197.     CPrintf("$f2%s", source);
  198.  
  199.         LoadBSPFile (source);
  200.     LoadEntities ();
  201.         
  202.     MakeTnodes (&dmodels[0]);
  203.  
  204.     LightWorld ();
  205.  
  206.     WriteEntitiesToString ();    
  207.     WriteBSPFile (source);
  208.  
  209.     ShowTempEntry("Average light level: %ld of 255", levelbrightness / (long)numfaces);
  210.  
  211.     diff = LastCheck - StartTime;
  212.     fprintf(LogFile, "\nLight completed successfully.  Elapsed time: %02d:%02d:%02d\n",
  213.         diff / 360, (diff / 60) % 59, diff % 59);
  214.     fprintf(LogFile, "-------------------------------------------\n\n");
  215.         fclose(LogFile);
  216.     LogFile = NULL;
  217.  
  218.     InitText();
  219.     printf("Light completed successfully.  Elapsed time: %02d:%02d:%02d\n",
  220.         diff / 360, (diff / 60) % 59, diff % 59);
  221.  
  222.         if (visbsp) {
  223.         printf("Running vis...\n");
  224.  
  225.                 if (visbspfast)
  226.                         execlp("vis", "vis", "-fast", source, NULL);
  227.         else
  228.             execlp("vis", "vis", source, NULL);
  229.         }
  230.  
  231.     return 0;
  232. }
  233.